package com.google.code.jtasks.client.ui;

import com.google.code.jtasks.common.data.Task;
import com.google.common.base.Strings;
import com.google.inject.Inject;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.util.List;

/**
 * Вспомогательный класс, содержит несколько методов по выводу объектов задач.
 */
public class TaskOutputter {
    private final ScreenHelper helper;

    @Inject
    TaskOutputter(ScreenHelper helper) {
        this.helper = helper;
    }

    /**
     * Выводит список задач, начиная с указанного смещения по вертикали.
     *
     * @param y смещение по вертикали
     * @param tasks список задач
     * @return смещение строки, расположенной сразу после последней строки вывода, плюс 1 или
     *         {@code y}, если список был пустой
     */
    public int printTasks(int y, List<Task> tasks) {
        for (Task task : tasks) {
            y = printTask(y, task) + 1;
        }
        helper.refresh();
        return y;
    }

    /**
     * Выводит список задач, начиная с указанного смещения по вертикали, причём каждая задача нумеруется
     * начиная с нуля.
     *
     * @param y смещение по вертикали
     * @param tasks список задач
     * @return смещение строки, расположенной сразу после последней строки вывода, плюс 1 или
     *         {@code y}, если список был пустой
     */
    public int printTasksWithNumbers(int y, List<Task> tasks) {
        int n = 0;
        for (Task task : tasks) {
            y = printTaskWithNumber(y, n, task) + 1;
            ++n;
        }
        helper.refresh();
        return y;
    }

    private static final DateTimeFormatter FORMATTER =
        DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withZone(DateTimeZone.getDefault());

    /**
     * Выводит задачу на консоль начиная с указанного смещения по вертикали.
     *
     * @param y смещение по вертикали
     * @param task задача, которую надо вывести
     * @return смещение по вертикали у строки, следующей за последней строкой вывода
     */
    public int printTask(int y, Task task) {
        helper.drawString(5, y,   "Name:       " + task.name);
        helper.drawString(5, y+1, "Start time: " + FORMATTER.print(task.startTime));
        helper.drawString(5, y+2, "End time:   " + FORMATTER.print(task.endTime));
        return y+3;
    }

    /**
     * Выводит задачу на консоль начиная с указанного смещения по вертикали, помеченную указанным номером.
     *
     * @param y смещение по вертикали
     * @param n номер задачи
     * @param task задача, которую надо вывести
     * @return смещение по вертикали у строки, следующей за последней строкой вывода
     */
    public int printTaskWithNumber(int y, int n, Task task) {
        String number = String.valueOf(n);
        String spaces = Strings.repeat(" ", number.length());
        helper.drawString(5, y,   number + ") Name: "       + task.name);
        helper.drawString(5, y+1, spaces + "  Start time: " + FORMATTER.print(task.startTime));
        helper.drawString(5, y+2, spaces + "  End time:   " + FORMATTER.print(task.endTime));
        return y+3;
    }
}
